Option Explicit

'################################################################
' Discriptor
' mainFilter 的条件执行器
'################################################################

Implements IDFFilterConditionExecutor

'################################################################
' Field
'################################################################
' join 连接的 DFFilter
Private parentDFFilter As DFFilter

Private condition As DFFilterCompositeCondition

' 在当前执行器内部，是否存在条件
Private hasCondition As Boolean

'################################################################
' Constructor
'################################################################
Private Sub Class_Initialize()
    hasCondition = False
End Sub

Private Sub Class_Terminate()
End Sub

'################################################################
' Init
'################################################################
Public Sub Init(ByRef f As DFFilter)
    If f Is Nothing Then
        Err.Raise 10001, Description:="parameter f must be not nothing"
        Exit Sub
    End If

    ' 保存 Filter
    Set parentDFFilter = f

    ' 创建条件执行器
    Set condition = New DFFilterCompositeCondition
End Sub

'################################################################
' Property
'################################################################
' 返回当前 Join 中的 DFFilter
Public Property Get IDFFilterConditionExecutor_Filter() As DFFilter
    Set IDFFilterConditionExecutor_Filter = parentDFFilter
End Property

'################################################################
' Function
'################################################################
Public Sub cAND(ByRef c As IDFFilterColCondition)
    condition.cAND c

    hasCondition = True
End Sub
Public Sub cOR(ByRef c As IDFFilterColCondition)
    condition.cOR c

    hasCondition = True
End Sub

' -----------------------------------------------
' Implements IDFFilterConditionExecutor Function
' -----------------------------------------------
' 在执行数据筛选前，执行预处理
' 至少要完成: 调用单 Filter 条件筛选 Filter 内的数据
Public Sub IDFFilterConditionExecutor_preExecute()
    ' 如果没有条件，则不执行预处理
    If hasCondition = False Then
        Exit Sub
    End If

    condition.extractFilterUsableRowBySingleCondition parentDFFilter
End Sub

' 执行正式的数据筛选处理
Public Function IDFFilterConditionExecutor_execActiveRowCheck() As Boolean
    ' 如果当前执行器没有任何条件，则默认所有数据都符合规则
    If hasCondition = False Then
        IDFFilterConditionExecutor_execActiveRowCheck = True
        Exit Function
    End If

    IDFFilterConditionExecutor_execActiveRowCheck = condition.IDFFilterColCondition_unsafeCheckActiveRowVal
End Function

' 获取当前条件中使用的所有 Filter
' @return HashSet<DFFilter>
Public Function IDFFilterConditionExecutor_getAllFilters() As ISet
    Set IDFFilterConditionExecutor_getAllFilters = condition.IDFFilterColCondition_getAllFilters
    IDFFilterConditionExecutor_getAllFilters.Add parentDFFilter
End Function
